package com.yht.weblog.web.markdown.renderer;

import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.commonmark.ext.image.attributes.ImageAttributes;
import org.commonmark.node.Image;
import org.commonmark.node.Node;
import org.commonmark.renderer.NodeRenderer;
import org.commonmark.renderer.html.HtmlNodeRendererContext;
import org.commonmark.renderer.html.HtmlWriter;

import java.util.Collections;
import java.util.Objects;
import java.util.Set;

/**
 * @author: yht
 * @date: 2024/1/21 22:54
 * @description:
 **/
public class ImageNodeRenderer implements NodeRenderer {
    /**
     * HTML 输出器
     */
    private final HtmlWriter html;
    /**
     * 图片宽度
     */
    private final static String KEY_WIDTH = "width";
    /**
     * 图片高度
     */
    private final static String KEY_HEIGHT = "height";

    public ImageNodeRenderer(HtmlNodeRendererContext context) {
        this.html = context.getWriter();

    }

    @Override
    public Set<Class<? extends Node>> getNodeTypes() {
        return Collections.singleton(Image.class);
    }

    /**
     * 重写render方法，用于渲染Node对象
     *
     * @param node 要渲染的Node对象
     */
    /**
     * 重写render方法，用于渲染Node对象
     *
     * @param node 要渲染的Node对象
     */
    @Override
    public void render(Node node) {
        // 将Node对象转换为Image对象
        Image image = (Image) node;
        html.line(); // 换行

        // 获取图片的链接地址
        String imgUrl = image.getDestination();

        // 获取图片的标题
        String imgTitle = image.getTitle();

        // 创建字符串构建器并添加图片链接地址
        StringBuilder str = new StringBuilder("<img src=\"")
                .append(imgUrl)
                .append("\"");

        // 如果图片标题不为空，则添加图片标题属性
        if (StringUtils.isNotBlank(imgTitle)) {
            str.append(String.format(" title=\"%s\" alt=\"%s\"", imgTitle, imgTitle));
        }

        // 获取Node对象的最后一个子节点
        Node lastChild = node.getLastChild();

        // 如果最后一个子节点不为空且是ImageAttributes类型
        if (Objects.nonNull(lastChild) && lastChild instanceof ImageAttributes) {
            // 将最后一个子节点转换为ImageAttributes对象
            ImageAttributes imageAttributes = (ImageAttributes) lastChild;

            // 如果ImageAttributes对象不为空且属性集合不为空
            if (Objects.nonNull(imageAttributes) && !CollectionUtils.isEmpty(imageAttributes.getAttributes())) {
                // 获取宽度属性
                String width = imageAttributes.getAttributes().get(KEY_WIDTH);
                // 获取高度属性
                String height = imageAttributes.getAttributes().get(KEY_HEIGHT);

                // 如果宽度属性不为空，则添加宽度属性
                str.append(StringUtils.isBlank(width) ? "" : (" " + KEY_WIDTH + "=" + width + "\""));
                // 如果高度属性不为空，则添加高度属性
                str.append(StringUtils.isBlank(height) ? "" : (" " + KEY_HEIGHT + "=" + height + "\""));

            }
        }

        // 添加闭合标签
        str.append(" />");

        // 如果图片标题不为空，在图片周围添加<span>标签
        if (StringUtils.isNotBlank(imgTitle)) {
            // 图文下方文字
            str.append(String.format("<span class=\"image-caption\">%s</span>", imgTitle));
        }

        // 将字符串添加到html中
        html.raw(str.toString());

        // 换行
        html.line();
    }


}
